package net.loststone.ingestion;

import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import net.loststone.*;

class IneService extends AbstractEconInfoService {

  static final String DESPESA_MITJANA_LLARS = "http://www.ine.es/jaxiBD/download.do?typeDownload=4&type=db&path=&file=&divi=EPF&per=12&idtab=133&descargarformato=Ir"
  static final String FONT = "I.N.E."
  
  static final String IPC_URL = "http://www.ine.es/daco/daco42/daco421/ipc0410.xls"
  static final String IPC = "IPC"

  

  boolean transactional = true

  /**
   * Agafa l'informacó 'internet si la pàgina no rebenta. Normalment rebenta.
   */
  String agafarDespesaMitjanaLlars() {
    def stream = getCSV(DESPESA_MITJANA_LLARS);
    if (stream.length > 1)
      processDMLL(stream)
    else {
      log.error "INE KK"
      println("no torna.");
    }
  }

  String agafarDespesaMitjanaLlarsLocal(stream) {
    
    StringWriter writer = new StringWriter();
    IOUtils.copy(stream, writer, "ISO-8859-1");
    String theString = writer.toString();
    
    def comunitats = [];

    String[] lines = theString.split("\n")
    for (String linia : lines) {
      String[] parts = linia.split(",");
      if (parts.length != 16) {
        continue
      } else {
        def comunitatPreu = [];
        comunitatPreu[0] = parts[0];
        comunitatPreu[1] = parts[7].replaceAll("\"","");

        // busqem la comunitat aquesta:
        Town comunitat = Town.findByNameAndType(comunitatPreu[0],"state");
        if (comunitat != null) {
          EconInfo econ = new EconInfo();
          econ.afecta = comunitat;
          econ.nom = GASTO_MEDIO_POR_HOGAR
          econ.valor = Double.parseDouble(comunitatPreu[1])
          econ.font = FONT
          econ.save();
          comunitats.add(comunitatPreu[0]);
        } else {
          log.warn("Comunitat "+comunitatPreu[0]+" no trobada a la base de dades.")
        }

      }
    }
    "[INE: Gasto medio por hogar (persona)] Afegits "+ comunitats;

  }

 
  
  /**
   * processa la despesa mitjana de les llars.
   */
  def processDMLL(response) {
    def comunitats = []
    String resposta = new String(response);
    String[] lines = resposta.split("\n")
    for (String linia : lines) {
      String[] parts = linia.split(",");
      if (parts.length != 16) {
        continue
      } else {
        def comunitatPreu = []
        comunitatPreu[0] = parts[0];
        comunitatPreu[1] = parts[7];
        comunitats.add(comunitatPreu);
      }
    }
    comunitats;
  }

  /**
   * Agafa l'excel dels internets
   */
 

  /**
   * Agafa l'ipc de totes les provincies.
   */
  def agafarIPC() {
    // agafem el link primer:
    String url = getIpcUrl(new Date());
    def stream = getExcel(url);
    HSSFWorkbook wb = new HSSFWorkbook(stream);

    Sheet espanya = wb.getSheetAt(5);

    
    for (def rowIdx = 10; rowIdx < 72; rowIdx++) {
      boolean insertat = false;
      Row row = espanya.getRow(rowIdx);
      String lloc = row.getCell(0).getStringCellValue();
      Double index = row.getCell(3).getNumericCellValue();

      // ja tenim les dades. a insertar.
      // mirem si és una CA.
      Town place = Town.findByNameAndType(lloc,"state");

      if (place != null) {
        // insertem a la CA.
        insertarIndicadorEconomic(place,index,"IPC");
        insertat = true;
      }
      // tornem amirar per veure si es una provincia.
      place = Town.findByNameAndType(lloc,"province");
      if (place != null) {
        insertarIndicadorEconomic(place,index,"IPC");
        insertat = true;
      }

      if (!insertat) {
        log.warn("No s'ha pogut insertar l'IPC a: "+lloc+". No s'ha fet matching amb el nom del lloc.");
      }
    }
  }

  public void insertarIndicadorEconomic(Town place, Double index, String nom) {
    EconInfo catInfo = new EconInfo();
    catInfo.nom = nom;
    catInfo.afecta = place;
    catInfo.font = FONT
    catInfo.valor = index

    updateOrSave(catInfo)

  }

  /**
   * Gets the url for the ipc excel file for THE PREVIOUS month.
   */
  public String getIpcUrl(Date date) {
    int month = date.getMonth();
    String sMonth;
    if (month < 10) {
      sMonth = "0"+Integer.toString(month);
    } else {
      sMonth = Integer.toString(month);
    }
    String year = Integer.toString(date.getYear());
    
    // nominacio de java.lang.Date com la classe mes cutre
    // de l'api de Java.
    if (year.size() == 1) {
        year = "0"+year;
    } else if (year.size() == 3) {
        year = year.substring(1,3);
    }
    return "http://www.ine.es/daco/daco42/daco421/ipc"+sMonth+year+".xls";
  }
  
}
